热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初版|候选人_社区实践为TVM新增OneFlow前端

篇首语:本文由编程笔记#小编为大家整理,主要介绍了社区实践为TVM新增OneFlow前端相关的知识,希望对你有一定的参考价值。0x0.背景

篇首语:本文由编程笔记#小编为大家整理,主要介绍了社区实践为 TVM 新增 OneFlow 前端相关的知识,希望对你有一定的参考价值。



0x0. 背景

去年在Summer Code的时候我刚好开始入门 TVM(虽然现在仍然也还是入门阶段,没做过什么有意义的工作),并且恰好来到OneFlow 工作就想着给 TVM 添加一个 OneFlow 前端。但可惜在 Summer Code 发起了这个项目后因为系统选人的 BUG 导致没有选到合适的候选人。后来我私下联系了申请这个项目的第二位候选人胡伽魁同学问他是否愿意来 OneFlow 实习并花1-2个月完成这件事,他同意了并在实习期间做了一个初版出来。感谢胡伽魁同学的贡献。

在这个初版的基础上,我做了一系列 代码重构,BUG 修复,文档编写,支持更多算子和模型转换之后 使其达到了一个相对稳定的状态。所以这篇文章来分享一下做这个小项目的经历和技术细节,希望对想做开源项目但还没有做过的读者提供一个参考。


0x1. 效果

这里没有截图全,可以去官方查看 https://tvm.apache.org/docs/how_to/compile_models/from_oneflow.html

Python API预览:

现在已经成功支持了 ResNet, MobileNet, ShuffleNet,GhostNet,YOLOV3,SRGAN,Vision Transformer在类的多种视觉模型,欢迎大家使用。使用方法见 https://tvm.apache.org/docs/how_to/compile_models/from_oneflow.html 。


0x2. PR历程

下面的截图展示了这一工作的 PR 流程,在4月合并了基础功能的 PR 后基本做的都是 Op 支持和模型支持以及 BUG 修复。

十分感谢TVM社区的 @masahi 在 PR 过程中的热心帮助。


0x3. 技术细节

实际上并没有什么细节可讲,基本上就是将OneFlow的IR进行逐一遍历以及逐 Op 转换。我之前已经介绍过 TVM 的 ONNX 前端的技术细节了:【从零开始学TVM】三,基于ONNX模型结构了解TVM的前端 ,所以这里就不再重复类似的细节了。我这里只列举一下 OneFlow 前端实现中的一些特殊一点的细节。


  • 形状和类型推导:对输入 Tensor 进行形状和类型推导,功能由 TVM 提供。代码见:https://github.com/apache/tvm/blob/main/python/tvm/relay/frontend/common.py#L524-L532
  • 形状和类型提升:对于如 concat 之类的 Op 来说,如果输入 Tensor 是不同类型或者不同形状并且符合提升原则的,那么就可以将其提升到最高类型或者固定的形状然后再转到 Relay IR。具体实现见:https://github.com/apache/tvm/blob/main/python/tvm/relay/frontend/oneflow.py#L95-L112
  • 消除获取 OneFlow Op 的输入 Tensor 名字的随机性:这个问题是因为 OneFlow 的 IR 由 Protobuf 做的序列化,所以导致遍历某个 Node 的时候拿到输入的名字是随机的,可能会造成 BUG 。为了解决这一问题,在获取名字的时候维护了一个有序的列表。具体实现在:https://github.com/apache/tvm/blob/main/python/tvm/relay/frontend/oneflow.py#L1756-L1765
  • Relay IR输入的确定:在 OneFlow IR 中输入节点名字都是带有_input.这个特征的,所以根据这个特征可以确定 Relay IR 的输入节点。具体实现:https://github.com/apache/tvm/blob/main/python/tvm/relay/frontend/oneflow.py#L1816-L1840

确定了输入 以及 Op 转换的规则后,整个 Relay IR 就可以方便的被构造出来了,感觉就没有什么可说的了。如果还想了解更多 TVM 前端具体细节就看上面那个链接吧。


0x4. 总结

本文简要介绍了笔者和胡伽魁给 TVM 新增 OneFlow 前端的工作,希望对想做开源项目但还没有做过的读者提供一个参考。


0x5. 参考链接
  • https://github.com/apache/tvm
  • https://github.com/Oneflow-Inc/oneflow

推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
author-avatar
泉州联合网2534
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有